package com.softWang.system.po;

import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.softWang.common.base.BasePO;
import com.softWang.common.base.TenantBasePO;
import com.softWang.common.validation.InEnum;
import com.softWang.system.constants.DataScopeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * 角色实体
 */
@TableName(value = "system_roles", autoResultMap = true)
@KeySequence("system_roles_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SystemRoles extends TenantBasePO {

    @ApiModelProperty(value = "主键id")
    @TableId
    private Long id;

    @ApiModelProperty(value = "角色名，最大长度为60位")
    @NotBlank(message = "rname不能为空")
    @Size(max = 60, message = "rname最大长度为60位")
    private String rname;

    @ApiModelProperty(value = "角色后台权限标识，最大长度为60位")
    @Size(max = 60, message = "code最大长度为60位")
    private String code;

    @ApiModelProperty(value = "类型，(1.内置角色，2.创建的普通角色)")
    private Integer type;

    @ApiModelProperty(value = "状态，0:正常,1:停用")
    private Integer state;

    @TableField(exist = false)
    private List<Long> menuIds;

    @TableField(exist = false)
    private List<Long> halfMenuIds;

    @NotNull(message = "dataScope不能为空")
    @InEnum(value = DataScopeEnum.class)
    @ApiModelProperty(value = "数据权限（1：全部数据权限  2：本部门数据权限 3：本部门及以下数据权限 4:指定部门数据权限 5:指定部门及下属部门数据权限）")
    private Integer dataScope;

    @TableField(exist = false)
    private List<Long> deptIds;

    /**
     * 状态枚举
     */
    public enum State {
        /**
         * 正常
         */
        NORMAL(0),
        /**
         * 停用
         */
        DISABLE(1);


        private Integer code;

        State(Integer code) {
            this.code = code;
        }
        public Integer getCode() {
            return this.code;
        }

    }

    /**
     * 类型枚举
     */
    public enum Type {
        /**
         * 内置角色
         */
        INNER(1),
        /**
         * 创建的普通角色
         */
        CREATED(2);


        private Integer code;

        Type(Integer code) {
            this.code = code;
        }
        public Integer getCode() {
            return this.code;
        }
    }

}